package com.atguigu.gulimall.order;


import org.mybatis.spring.annotation.MapperScan;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1.引用了amqp:RabbitAutoConfiguration就会自动生效
 * （Advanced Message Queuing Protocol，高级消息队列协议）是一个进程间传递异步消息的网络协议。
 * 2.给容器中自动配置了：
 *      RabbitTemplate,AmqpAdmin.CachingConnectionFacrory 等组件
 * 3.@RabbitListener(queues ={"hello-java-queue"})监听注解，放在方法和类之上,(监听那些队列)
     @RabbitHander： 标在方法上(重载区分不同的信息)
    本地事务失效的问题：
     同一个对象内事务方法互相调用默认失效，原因绕过了代理对象
       解决：1.引入spring-boot-start-aop 引入了aspectj
            2.@EnableAspectJAutoProxy 开启AspectJ 动态代理功能 以后的代理对象由aspectj创建(即使没有接口)
            3.exposeProxy = true对外暴露代理对象
            4.事务使用代理对象来控制(AopContext)  静态代理
    seata控制分布式事务
    1) 每一个微服务都要创建undo_log回滚表
    2) 安装事务协调器: seata-server
    3) 1.导入依赖 spring-cloud-starter-alibaba-seata 0.7.1
       2.启动seata-server:
            registry.conf:注册中心配置  type=nacos
            file.conf
       3.所有想用到分布式事务的微服务使用 seata DataSourceProxy代理自已的数据源
       4.每个微服务都导入 registry.conf和file.conf
       5.启动测试分布式事务，大事务全局事务，小事务还是@transactional
     //(exclude = GlobalTransactionAutoConfiguration.class)
     channel 报错：
     这是因为在写消息接收者的时候方法写错了，重启项目 队列已经注册过了，再次运行项目队列信息不匹配所致
 */
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableRedisHttpSession
@EnableDiscoveryClient
@EnableRabbit
@EnableFeignClients
@MapperScan("com.atguigu.gulimall.order.dao")
@SpringBootApplication
public class GulimallOrderApplication {

    public static void main(String[] args)  {
        SpringApplication.run(GulimallOrderApplication.class, args);
    }

}
